home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 009 / eqpat01.arc / PSHERC.ASM < prev    next >
Assembly Source File  |  1986-10-10  |  3KB  |  112 lines

  1. PAGE     60,132
  2. TITLE    PSHERC
  3. ;    Program to let Print Shop from Broderbund use
  4. ;    Equity II Hercules mode.
  5. ;    The program stays resident in memory and does not let
  6. ;    programs use the BIOS to set video mode 4 (320x200 
  7. ;    color) through INT 10h, function 0.
  8.  
  9.  
  10. ;    DOS definitions
  11. dos        equ    21h        ;dos interrupt
  12. term_res    equ    31h        ;terminate but stay resident
  13. terminate    equ    4ch        ;terminate process
  14. set_vector    equ    25h        ;set interrupt vector
  15. get_vector    equ    35h        ;get interrupt vector
  16. display_str    equ    09        ;display string
  17. ;    Interrupt numbers
  18. video_int    equ    10h
  19. ;    Control characters
  20. cr        equ    0dh
  21. lf        equ    0ah
  22.  
  23. code        segment para 'CODE'
  24.  
  25.     assume    cs:code,ds:nothing,es:nothing,ss:nothing
  26.     org    100h
  27.  
  28. begin:    jmp    short start
  29.  
  30. pshercfix    proc    far
  31.  
  32. new_video_int:        ;BIOS video (INT 10H) is redirected here.
  33.             ;Check to see if user program is requesting
  34.             ;set 320x200 mode (mode 4)
  35.  
  36.     cmp    ah,0        ;set video mode?
  37.     jnz    go_vid        ;no, just continue
  38.     cmp    al,4        ;set 320x200 mode?
  39.     jnz    go_vid        ;if not, goto video int
  40.     iret            ;don't let mode 4 happen!!
  41.  
  42. go_vid:    jmp    dword ptr cs:old_video_int    ;go to real int 10h
  43.     
  44.  
  45. sig_offset    equ    $ - new_video_int
  46. res_sig:    db    'PSHercFix'
  47. sig_len        equ    $ - res_sig
  48.  
  49. old_video_int    dd    ?
  50. last        equ    $-1    ;mark end of resident code
  51.  
  52. pshercfix    endp
  53.  
  54.     assume ds:code
  55. start    proc near    ;redirect video int to point to
  56.             ;new_video_int and save current vector
  57.  
  58.     mov    sp,offset stack
  59.     call    chk_res        ;see if we're resident already
  60.                 ;returns interrupt address in ES:BX
  61.  
  62.     mov    word ptr old_video_int,bx        ;store offset
  63.     mov    word ptr old_video_int[2],es        ;store segment
  64.  
  65.     mov    dx,offset new_video_int        ;DS:DX is now new int address
  66.     mov    al,video_int    ;video interrupt #
  67.     mov    ah,set_vector    ;set vector func
  68.     int    dos        ;set int 10h to new_video_int
  69.  
  70.     mov    dx,offset last    ;byte count of code to stay resident
  71.     mov    cl,4
  72.     shr    dx,cl        ;change to paragraph count
  73.     inc    dx        ;just to be sure
  74.     mov    ah,term_res    ;stay resident
  75.     mov    al,0        ;return code of 0
  76.     int    dos        ;that's all folks
  77. start    endp
  78.  
  79. chk_res        proc near    ;check if pshercfix routine resident
  80.                 ;if not, returns current video interrupt
  81.                 ;in ES:BX
  82.     mov    ah,get_vector
  83.     mov    al,video_int    ;video interrupt
  84.     int    dos        ;get video interrupt vector in es:bx
  85.     mov    di,sig_offset    ;offset of signature bytes from int offset
  86.     add    di,bx        ;add in interrupt offset
  87.     mov    si,offset res_sig    ;point to sig bytes
  88.     mov    cx,sig_len    ;length of sig
  89.     cld
  90.     repz    cmpsb        ;is it there?
  91.     jz    its_there
  92.     ret            ;back to main program
  93.  
  94. its_there:    ;print already resident message
  95.     pop    ax        ;clean up stack
  96.  
  97.     mov    dx,offset there_mes
  98.     mov    ah,display_str
  99.     int    dos        ;display message
  100.     mov    ah,terminate    ;normal end of process
  101.     mov    al,0
  102.     int    dos        ;back to calling process
  103.  
  104. there_mes:
  105.     db    cr,lf,'Already resident ...',cr,lf,'$'
  106. chk_res        endp
  107.     EVEN
  108. stk:        db    16 dup('STACK...')
  109. stack        label    word
  110. code        ends
  111.         end    begin
  112.